package baseUserModel

import (
	"github.com/mitchellh/mapstructure"
	"learn/app/models/cm"
	"learn/pkg/hepler"
	"learn/pkg/logger"
)

// LearnRole 角色表
type Role struct {
	cm.BaseModel `mapstructure:",squash"`
	RoleName     string `json:"role_name" gorm:"role_name" mapstructure:"role_name"` // 角色
	Status       int8   `json:"status" gorm:"status"`                                // 角色状态：1 正常，2 关闭
	MenuIds      string `json:"menu_ids" gorm:"menu_ids" mapstructure:"menu_ids"`    // 菜单id ,拼接
	cm.CommonTimestampsField
}

// TableName 表名称
func (*Role) TableName() string {
	return "learn_role"
}
func (obj *Role) Add(input map[string]interface{}) uint64 {
	role := Role{}
	if err := mapstructure.Decode(input, &role); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	res := obj.Db().Create(&role)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return role.ID
}

func (obj *Role) List() ([]map[string]interface{}, int64) {
	roleList := []Role{} // 不用结构体。无法使用自定义类型
	var count int64

	res := obj.Db().Model(Role{}).Find(&roleList).Count(&count)

	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
	}

	return obj.StructSliceToMapSlice(roleList), count
}

func (obj *Role) Update(input map[string]interface{}) uint64 {
	role := Role{}
	if err := mapstructure.Decode(input, &role); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	db := obj.Db()
	if hepler.Empty(role.ID) == false {
		db = db.Where("id", role.ID)
	} else {
		return 0
	}

	res := db.Updates(&role)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return role.ID
}

func (obj *Role) Del(input map[string]interface{}) uint64 {
	role := Role{}
	if err := mapstructure.Decode(input, &role); err != nil {
		logger.Error("db Err" + err.Error())
		return 0
	}
	db := obj.Db()
	if hepler.Empty(role.ID) == false {
		db = db.Where("id", role.ID)
	} else {
		return 0
	}

	res := db.Delete(&role)
	if res.Error != nil {
		logger.Error("db Err" + res.Error.Error())
		return 0
	}
	return role.ID
}
